#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2024/8/7 19:52
# @Author  : Yuyun
# @File    : 浮点数精度处理与计算.py
# @IDE     : PyCharm


a = 3.14121231217828774329

#   方法① —— 引入decimal模块
print('*'* 30 + '示例'+ '*' * 50)

from decimal import Decimal
print(f"{Decimal('1.09')-Decimal('0.1')}")      #
print(Decimal.from_float(1.09-0.1))     #看计算机上实际存在的浮点值
print(Decimal('2.675').quantize(Decimal('0.00')))       #解决四舍五入精度问题

#getcontext()全局精度处理
print('*'* 30 + 'getcontext()函数处理'+ '*' * 50)

from decimal import getcontext
cur_context = getcontext()
cur_context.prec = 9        #设置全局精度为9
m = Decimal('1231.901230456')       #全局精度仅对Decimal中文本生效
n = Decimal(193.123912308234)       #对数字不生效
print(m)
print(n)

#quantize()函数处理
print('*'* 30 + 'quantize()函数处理'+ '*' * 50)
"""
decimal_object.quantize(exp, rounding=None, context=None)
参数
exp: 指定新的精度。通常是一个 Decimal 对象，用来表示目标精度。例如，如果想保留两位小数，可以使用 Decimal('0.01')。
rounding: 可选参数，指定舍入模式。如果不指定，默认使用当前的上下文舍入模式。常见的舍入模式包括：
decimal.ROUND_HALF_UP: 四舍五入
decimal.ROUND_DOWN: 向下舍入（截断）
decimal.ROUND_UP: 向上舍入
decimal.ROUND_HALF_EVEN: 银行家舍入法
……
context: 可选参数，表示舍入时使用的上下文环境。
"""
#   1、不引入ROUND_HALF_UP 等rounding值
x_1 = Decimal('9.0199397')
y_1 = x_1.quantize(Decimal('0.000'), rounding = 'ROUND_DOWN')
print(y_1)

#   2、直接从decimal类中引入ROUND_HALF_UP 等rounding值
from decimal import ROUND_UP
x_2 = Decimal('123.2132')
y_2 = x_2.quantize(Decimal('0.000'), rounding = ROUND_UP)
print(y_2)

#   方法②—— 使用round(num , ndigit)函数，不写ndigit默认四舍五入为整数；ndigit为四舍五入后的小数位数
print('*'* 30 + 'round()函数处理'+ '*' * 50)

b = round(a)
print(b)        #输出整数

c = round(a, 4)
print(c)        #保留小数后4位，若形如2.0这种小数，则只会输出2.0，不会输出后续0

#   方法③——使用format()格式化，但是均变为字符串类型，仅适合格式化输出
formatted_str = "%.2f" % a
print(type(formatted_str))
print(formatted_str)  # 输出: 3.14

# 使用 str.format()
formatted_str1 = "{:.2f}".format(a)
print(type(formatted_str1))
print(formatted_str1)  # 输出: 3.14

# 使用 f-string (Python 3.6+)
formatted_str2 = f"{a:.2f}"
print(type(formatted_str2))
print(formatted_str2)  # 输出: 3.14
